﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ejercicio4;

/*
 * Clase que representa la informacion que almacena un cd de musica.
 * 
 * Autor : Bettiol, Marmol, Mattana, Rodeguiero.
 * 
 */
namespace Ejercicio4
{
    public class CdInfo
    {
        private Tiempo duracionCD;
        private String genero;
        private String titulo;
        private int numeroDePistas;
        private LinkedList<Pista> pistas;

        public CdInfo()
        {
            Tiempo duracion = new Tiempo();
            genero = "";
            titulo = "";
            numeroDePistas = 0;
            pistas = new LinkedList<Pista>();
        }

        public CdInfo(Tiempo duracion,String genero,String titulo,int numeroDePistas,LinkedList<Pista> pistas)
        {
            // <pex>
            if (duracion == (Tiempo)null)
                throw new ArgumentNullException("duracion");
            if (pistas == (LinkedList<Pista>)null)
                throw new ArgumentNullException("pistas");
            // </pex>
            this.duracionCD = duracion;
            this.genero = genero;
            this.titulo = titulo;
            this.numeroDePistas = numeroDePistas;
            this.pistas = pistas;

        }

        public static CdInfo Create(string genero_s, string titulo_s1, Pista pista_pista)
        {
            CdInfo cdInfo = new CdInfo();
            cdInfo.setGenero(genero_s);
            cdInfo.setTitulo(titulo_s1);
            cdInfo.insertarPista(pista_pista);
            return cdInfo;

            // TODO: Edit factory method of CdInfo
            // This method should be able to configure the object in all possible ways.
            // Add as many parameters as needed,
            // and assign their values to each field by using the API.
        }


        public void insertarPista(Pista pista)
        {
            // <pex>
            if (pista == (Pista)null)
                throw new ArgumentNullException("pista");
            if (pista.getTiempoPista() == (Tiempo)null)
                throw new ArgumentNullException("pista");
            // </pex>
            duracionCD.sumaTiempos(pista.getTiempoPista());
            pistas.AddLast(pista);
            numeroDePistas++;
        }

        public void eliminarPista(Pista pista)
        {
            // <pex>
            if (pista == (Pista)null)
                throw new ArgumentNullException("pista");
            // </pex>
            duracionCD.restarTiempos(pista.getTiempoPista());
            pistas.Remove(pista);
            numeroDePistas--;
        }

        public void setGenero(String genero)
        {
            this.genero = genero;
        }

        public void setTitulo(String titulo)
        {
            this.titulo = titulo;
        }

        public bool repOK()
        {
            //no haya cds vacios.(ver constructor)
            //numero de pistas igual al tamaño de la lista
            //numreo de pista... es igual a posicion en el arreglo.
            //Que ningun elemento sea null.
            if (titulo == "")
                return false;
            if (pistas.Count() == 0)
                return false;
            if (numeroDePistas != pistas.Count())
                return false;
            Tiempo tiempoAux = new Tiempo();
            for (int i = 0; i < pistas.Count(); i++)
            {
                Tiempo tiempoPista1 = pistas.ElementAt(i).getTiempoPista();
                tiempoAux.sumaTiempos(tiempoPista1);
            }
            return (duracionCD.Equals(tiempoAux));
        }

    }
}
